package com.baizhi.method;

public class MethodDemo{
    public static void main(String[] args) {
        //父类型的变量指向了子类型的对象，就叫向上造型
        /*
         向上造型创建对象，在编译的时候，并不会去检查具体的子类
         在编译的时候，首先发现Pet p，所确定的是这是一个Pet对象
         继续往后编译会检查等号后面要使用的类和签名声明的类是否有继承关系
         检查发现Cat和 Pet有继承关系，所以编译通过，而此时并没有去检查具体是哪一个子类，
         既然没有检查具体是办一个子类，那么就没法去顶子类中拥有哪些方法，
         所以在使用的时候就不允许调用子类中独有的方法
         此时只允许调用父类中声明的方法
         */
        //能调用哪个方法看左边
        //指定的什么内容看右边
    /*    Pet p = new Cat();
        p.eat();
        //p.eat("猫粮");
       // p.catchMouse();

        Pet p2 = new Dog();
        p2.eat();
        //p2.bark();


        //向上造型 / 向上转型
        Pet p3 = new Cat();  //父类型的引用指向子类型的应用

        //向下转型
        Cat c = (Cat)p3; //将已经向上造型的父类型的引用通过强制类型转换赋值给子类型的引用

        //ClassCastException异常
        Dog dog = (Dog) p3;*/

        //向上造型
        Pet p = new Dog();

        //向下转型
        if(p instanceof Cat){
            Cat c = (Cat)p;
            c.catchMouse();
        }else if(p instanceof Dog){
            Dog d = (Dog)p;
            d.bark();
        }



    }
}


class Pet{
    public void eat(){
        System.out.println("在吃东西");
    }

    public void eat(String food){
        System.out.println("在吃"+food);
    }
}

class Cat extends Pet{

    @Override
    public void eat() {
        System.out.println("这只猫在吃鱼~~~");
    }

    public void catchMouse(){
        System.out.println("这只猫在抓老鼠~~~");
    }
}

class Dog extends Pet{
    @Override
    public void eat() {

        System.out.println("这只狗在吃骨头~~~");
    }

    public void bark(){
        System.out.println("这只狗在朝着陌生人叫~~~");
    }
}

class Fish extends Pet{

    @Override
    public void eat() {
        System.out.println("鱼在吃蚯蚓~~~");
    }

    public void swiming(){
        System.out.println("这条鱼在游泳~~~");
    }
}
